﻿using System;
using System.Collections;// 没有泛型
using System.Collections.Generic; // 泛型
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 泛型集合
{
    class Program
    {
        static void Main(string[] args)
        {
            // testList();
            // testDictionary();
            // TestArrayList();
            TestList();

            Console.ReadKey();
        }

        /// <summary>
        /// 相比于数组，可以动态扩容。
        /// </summary>
        static void TestArrayList()
        {
            // 没有限制元素的数据类型，就是什么都可以装
            ArrayList arrayList = new ArrayList();
            arrayList.Add(1);
            arrayList.Add(2);
            arrayList.Add(3);
            arrayList.Add(4);
            arrayList.Add(5);
            arrayList.Add(6);
            arrayList.Add("hello");

            // 增删改查操作
            arrayList.RemoveAt(0); // 按索引删除
            arrayList.Remove(4); // 按元素删除
            arrayList.Remove("hello");

            arrayList.Insert(0, 11); // 指定索引处插入
            arrayList[0] = 1; // 指定索引进行修改

            arrayList.InsertRange(arrayList.Count - 1, arrayList);
            arrayList[arrayList.Count - 1] = "hello world";
            int x = arrayList.IndexOf("hello world"); // 根据元素值，返回所在的索引
            Console.WriteLine("索引位置：{0}",x);
            foreach (var item in arrayList)
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// 相比于ArrayList，可以限制存储的数据的类型。并且不需要进行装箱和拆箱操作。减少了性能的损耗。
        /// 在使用的时候，编译器，就可以防止添加不合适的数据类型。
        /// </summary>
        static void TestList()
        {
            // 尖括号，限定数据类型。数组的方括号限定长度。
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3); // 添加


            list.Insert(list.Count - 1, 4); 
            list.RemoveAt(list.Count - 2); // 删除

            list.InsertRange(list.Count - 1, list); // 插入

            //list.ForEach(x => Console.WriteLine(x));
            int v = list.Find(x=> x == 1);
            Console.WriteLine(v);

            //foreach (var item in list)
            //{
            //    Console.WriteLine(item);
            //}

            //List<int>.Enumerator enumerator = list.GetEnumerator();
            //while(enumerator.MoveNext())
            //{
            //    int current = enumerator.Current;
            //    Console.WriteLine(current);
            //}
        }


        private static void testDictionary()
        {
            Dictionary<int, string> dict = new Dictionary<int, string>();
            dict.Add(1,"yejing");
            dict.Add(2,"wangmao");
            dict.Add(3,"lisi");
            dict.Add(4,"maming");

            // 遍历一
            var enumerator = dict.GetEnumerator();
            while (enumerator.MoveNext())
            {
                var keyValuePair = enumerator.Current;
                Console.WriteLine($" {keyValuePair.Key} : {keyValuePair.Value}");
            }

            // 遍历二
            foreach (KeyValuePair<int,string> v in dict)
            {
                Console.WriteLine($" {v.Key} : {v.Value}");  
            }
        }

        private static void testList()
        {

            List<String> list = new List<string>();

            list.Add("zhangsan");
            list.Add("李四");
            list.Add("wangwu");
            list.Add("maliu");

            list.Sort();
            list.Reverse();
            foreach(string l in list)
            {
                Console.WriteLine(l);
            }

        }
    }
}
